import tensorflow as tf

# 广播(Broadcasting)是TensorFlow中处理不同形状张量运算的重要机制，它自动扩展较小的张量以匹配较大张量的形状。\

'''广播的规则：
从最后一个维度开始向前比较
最后一维要么相等，要么其中一个为1，要么其中一个不存在
在缺失或为1的维度上进行复制扩展'''

a = tf.constant([[1, 2, 3], [4, 5, 6]])
b = tf.constant([10, 20, 30])

c = a + b  # 广播机制使得b可以广播到a的形状，然后进行元素级相加
print(c)  # [[11 22 33] [14 25 36]]

d = a + tf.constant(4)  # 这样会复制4，直到匹配a的形状
print(d)  # [[5 6 7] [8 9 10]]

e = tf.constant([[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]])
# f = a + e  # 不能广播，因为e的最后一维为6，而a的最后一维为3

g = tf.constant([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# h = a + g  # 不能广播，因为g的形状为(3,3)，而a的形状为(2,3)
# 广播只从最后一维开始，看是否相等或者其中一个为1，所有不相等且不为1的都不能广播，倍数关系也不行。

i = tf.constant([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
j = i + a # 可以广播，i形状为(2,2,3)，a形状为(2,3)，可以广播到(2,2,3)
# 广播：如果维度不对等，则从最后一维开始匹配，当维度不够的时候，会自动升维，直到匹配。

